#include <iostream>
#include <cstring>
using namespace std;

/*
    总结调用构造函数所有的写法
     1.注意如下两种写法的区别
     Cat c1(); //编译正确，C++编译器会把这句话当成是函数声明来理解，不当成是创建对象
            Cat cl();
            函数名c1
            返回值Cat
            形参无

     Cat cl;   //编译正确，会调用w
*/

class Cat
{
public:
    Cat(string _name, int _age, float _weight)
    {
        name = _name;
        age = _age;
        weight = _weight;
    }

    Cat(string _name, int _age)
    {
        name = _name;
        age = _age;
        weight = 0.0;
    }
    Cat()
    {
        cout << "调用无参构造" << endl;
    }

private:
    string name;
    int age;
    float weight;
};

int main()
{
    // 写法1 调用无参构造
    // 栈空间
    // Cat c1(); 根本没有调用任何构造函数C++把这句话当成了函数声明
    // Cat c1;

    // 堆空间    这两个都可以
    // Cat *c1 = new Cat(); // 正确，调用无参构造
    // Cat *c2 = new Cat;   // 正确，调用无参构造
    // delete c1;
    // delete c2;

    // 写法2 调用有参构造
    // Cat c1 = Cat("小白", 2, 3.3); // 调用有参构造

    // 写法3
    // Cat c1;                   // 无参构造
    // c1 = Cat("小白", 2, 3.3); // 调用有参构造

    // 写法4 c++11新增的语法特性
    // Cat c1{"小白", 2, 3.3};    // 调用有参构造
    // Cat c1 = {"小白", 2, 3.3}; // 调用有参构造
    Cat c1{};                  // 调用无参构造
    return 0;
}